home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / pointlist / ptlBezier.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-02  |  3.4 KB  |  135 lines

  1. #include "ooglutil.h"
  2. #include "geom.h"
  3. #include "bezierP.h"
  4. #include "pointlistP.h"
  5.  
  6. void *bezier_PointList_get(int sel, Geom *geom, va_list args);
  7. void *bezier_PointList_fillin(int sel, Geom *geom, va_list args);
  8. void *bezier_PointList_set(int sel, Geom *geom, va_list args);
  9. void *bezier_PointList_length(int sel, Geom *geom, va_list args);
  10.  
  11. #define MAX_METHODS 4
  12.  
  13. static SpecFunc methods[] = {
  14.   "PointList_get", bezier_PointList_get,
  15.   "PointList_fillin", bezier_PointList_fillin,
  16.   "PointList_set", bezier_PointList_set,
  17.   "PointList_length", bezier_PointList_length
  18.   };
  19.  
  20. static char msg[] = "ptlBezier.c";
  21.  
  22. ptlBezier_init() {
  23.   pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("bezier"));
  24. }
  25.  
  26. void *bezier_PointList_get(int sel, Geom *geom, va_list args) {
  27.   HPoint3 *pt;
  28.   float **t;
  29.   int n_points;
  30.   Bezier *b = (Bezier *)geom;
  31.  
  32.   t = va_arg(args, float **);
  33.  
  34.   n_points = (int)GeomCall(GeomMethodSel("PointList_length"), geom);
  35.   pt = OOGLNewNE(HPoint3, n_points, msg);
  36.  
  37.   return (GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt));
  38.  
  39. }
  40.  
  41. void *bezier_PointList_fillin(int sel, Geom *geom, va_list args) {
  42.   int i;
  43.   float **t;
  44.   HPoint3 *pt;
  45.   Bezier *b = (Bezier *)geom;
  46.  
  47.   t = va_arg(args, float **);
  48.   va_arg(args, int);      
  49.   pt = va_arg(args, HPoint3 *);
  50.  
  51.   if (b->CtrlPnts != NULL)
  52.     if (b->dimn == 3) 
  53.       for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++)
  54.     HPt3From(&pt[i], b->CtrlPnts[i*3], b->CtrlPnts[i*3 + 1], 
  55.          b->CtrlPnts[i*3 + 2], 1.0);
  56.     else if (b->dimn == 4)
  57.       for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++)
  58.     HPt3From(&pt[i], b->CtrlPnts[i*4], b->CtrlPnts[i*4 + 1],
  59.          b->CtrlPnts[i*4 + 2], b->CtrlPnts[i*4 + 3]);
  60.     else {
  61.       OOGLError(1, "Bezier patch of unfamiliar dimensions.");
  62.       OOGLFree(pt);
  63.       return NULL;
  64.     }
  65.  
  66. #ifdef DONT_DO_THIS
  67.   if (b->flag & BEZ_ST) {
  68.     HPt3From(&pt[i], b->STCords[0], b->STCords[1], b->STCords[2], 
  69.          b->STCords[3]);
  70.     HPt3From(&pt[i+1], b->STCords[4], b->STCords[5], b->STCords[6],
  71.          b->STCords[7]);
  72.   }
  73. #endif /*DONT_DO_THIS*/
  74.  
  75.   HPt3TransformN(t, pt, pt, i+1);
  76.  
  77.   return pt;
  78. }
  79.  
  80.  
  81. void *bezier_PointList_set(int sel, Geom *geom, va_list args) {
  82.   int i;
  83.   HPoint3 *pt;
  84.   Bezier *b = (Bezier *)geom;
  85.  
  86.   va_arg(args, int);
  87.   pt = va_arg(args, HPoint3 *);
  88.   i = 0;
  89.   if (b->CtrlPnts != NULL) 
  90.     if (b->dimn == 3) 
  91.       for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) {
  92.     b->CtrlPnts[i*3] = pt[i].x;
  93.     b->CtrlPnts[i*3 + 1] = pt[i].y;
  94.     b->CtrlPnts[i*3 + 2] = pt[i].z;
  95.       }
  96.     else if (b->dimn == 4) 
  97.       for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) {
  98.     b->CtrlPnts[i*4] = pt[i].x;
  99.     b->CtrlPnts[i*4 + 1] = pt[i].y;
  100.     b->CtrlPnts[i*4 + 2] = pt[i].z;
  101.     b->CtrlPnts[i*4 + 3] = pt[i].w;
  102.       }
  103.     else {
  104.       OOGLError(1, "Bezier patch of unfamiliar dimension.");
  105.       return NULL;
  106.     }
  107.  
  108. #ifdef DONT_DO_THIS
  109.   if (b->flag & BEZ_ST) {
  110.     b->STCords[0] = pt[i].x;
  111.     b->STCords[1] = pt[i].y;
  112.     b->STCords[2] = pt[i].z;
  113.     b->STCords[3] = pt[i++].w;
  114.     b->STCords[4] = pt[i].x;
  115.     b->STCords[5] = pt[i].y;
  116.     b->STCords[6] = pt[i].z;
  117.     b->STCords[7] = pt[i].w;
  118.   }
  119. #endif /*DONT_DO_THIS*/
  120.  
  121.   GeomDelete((Geom *)b->mesh);
  122.   b->mesh = NULL;
  123.  
  124.   return geom;
  125. }
  126.  
  127. void *bezier_PointList_length(int sel, Geom *geom, va_list args) {
  128.   Bezier *b = (Bezier *)geom;
  129.   return ((void *)((b->degree_u + 1) * (b->degree_v + 1)
  130. #ifdef DONT_DO_THIS
  131.     + (b->flag & BEZ_ST ? 2 : 0)
  132. #endif 
  133.     ));
  134. }
  135.